# Always print this out before your assignment
sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] knitr_1.36

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.7       digest_0.6.28    later_1.3.0      mime_0.12       
 [5] R6_2.5.1         lifecycle_1.0.1  xtable_1.8-4     magrittr_2.0.1  
 [9] evaluate_0.14    rlang_0.4.12     promises_1.2.0.1 ellipsis_0.3.2  
[13] rmarkdown_2.11   tools_4.1.2      shiny_1.7.1      yaml_2.2.1      
[17] xfun_0.28        httpuv_1.6.3     fastmap_1.1.0    compiler_4.1.2  
[21] htmltools_0.5.2 
getwd()
[1] "C:/Users/Daniel/Documents/GitHub/MGSC-310-Project"

library("here")
here() starts at C:/Users/Daniel/Documents/GitHub/MGSC-310-Project
library("tidyverse")
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages -------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5     v purrr   0.3.4
v tibble  3.1.6     v dplyr   1.0.7
v tidyr   1.1.4     v stringr 1.4.0
v readr   2.1.0     v forcats 0.5.1
-- Conflicts ----------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library("forcats")
library("rsample")
library("ggplot2")
library("ggmap")
Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
Please cite ggmap if you use it! See citation("ggmap") for details.
library("dplyr")
library("lubridate")

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
library("xgboost")
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: ‘xgboost’

The following object is masked from ‘package:dplyr’:

    slice
library('DiagrammeR')
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library('Matrix')

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack

crashes <- read.csv(here("datasets", "US_Accidents_Dec20_updated.csv"))

summary(crashes)
      ID               Severity      Start_Time          End_Time        
 Length:1516064     Min.   :1.000   Length:1516064     Length:1516064    
 Class :character   1st Qu.:2.000   Class :character   Class :character  
 Mode  :character   Median :2.000   Mode  :character   Mode  :character  
                    Mean   :2.239                                        
                    3rd Qu.:2.000                                        
                    Max.   :4.000                                        
                                                                         
   Start_Lat       Start_Lng          End_Lat         End_Lng       
 Min.   :24.57   Min.   :-124.50   Min.   :24.57   Min.   :-124.50  
 1st Qu.:33.85   1st Qu.:-118.21   1st Qu.:33.85   1st Qu.:-118.21  
 Median :37.35   Median : -94.38   Median :37.35   Median : -94.38  
 Mean   :36.90   Mean   : -98.60   Mean   :36.90   Mean   : -98.60  
 3rd Qu.:40.73   3rd Qu.: -80.87   3rd Qu.:40.73   3rd Qu.: -80.87  
 Max.   :49.00   Max.   : -67.11   Max.   :49.08   Max.   : -67.11  
                                                                    
  Distance.mi.      Description            Number           Street         
 Min.   :  0.0000   Length:1516064     Min.   :      0   Length:1516064    
 1st Qu.:  0.0000   Class :character   1st Qu.:   1212   Class :character  
 Median :  0.1780   Mode  :character   Median :   4000   Mode  :character  
 Mean   :  0.5873                      Mean   :   8908                     
 3rd Qu.:  0.5940                      3rd Qu.:  10100                     
 Max.   :155.1860                      Max.   :9999997                     
                                       NA's   :1046095                     
     Side               City              County             State          
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   Zipcode            Country            Timezone         Airport_Code      
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Weather_Timestamp  Temperature.F.   Wind_Chill.F.     Humidity...    
 Length:1516064     Min.   :-89.00   Min.   :-89.0    Min.   :  1.00  
 Class :character   1st Qu.: 47.00   1st Qu.: 40.8    1st Qu.: 48.00  
 Mode  :character   Median : 61.00   Median : 57.0    Median : 68.00  
                    Mean   : 59.58   Mean   : 55.1    Mean   : 64.66  
                    3rd Qu.: 73.00   3rd Qu.: 71.0    3rd Qu.: 84.00  
                    Max.   :170.60   Max.   :113.0    Max.   :100.00  
                    NA's   :43033    NA's   :449316   NA's   :45509   
  Pressure.in.   Visibility.mi.   Wind_Direction     Wind_Speed.mph. 
 Min.   : 0.00   Min.   :  0.00   Length:1516064     Min.   :  0.00  
 1st Qu.:29.44   1st Qu.: 10.00   Class :character   1st Qu.:  4.60  
 Median :29.88   Median : 10.00   Mode  :character   Median :  7.00  
 Mean   :29.55   Mean   :  9.13                      Mean   :  7.63  
 3rd Qu.:30.04   3rd Qu.: 10.00                      3rd Qu.: 10.40  
 Max.   :58.04   Max.   :140.00                      Max.   :984.00  
 NA's   :36274   NA's   :44211                       NA's   :128862  
 Precipitation.in. Weather_Condition    Amenity              Bump          
 Min.   : 0        Length:1516064     Length:1516064     Length:1516064    
 1st Qu.: 0        Class :character   Class :character   Class :character  
 Median : 0        Mode  :character   Mode  :character   Mode  :character  
 Mean   : 0                                                                
 3rd Qu.: 0                                                                
 Max.   :24                                                                
 NA's   :510549                                                            
   Crossing           Give_Way           Junction           No_Exit         
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   Railway           Roundabout          Station              Stop          
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Traffic_Calming    Traffic_Signal     Turning_Loop       Sunrise_Sunset    
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Civil_Twilight     Nautical_Twilight  Astronomical_Twilight
 Length:1516064     Length:1516064     Length:1516064       
 Class :character   Class :character   Class :character     
 Mode  :character   Mode  :character   Mode  :character     
                                                            
                                                            
                                                            
                                                            


crashes_clean <-
  crashes %>% 
  mutate(Start_Time_Clean = ymd_hms(Start_Time),
         End_Time_Clean = ymd_hms(End_Time),
         Weather_Condition_Clean = as.factor(Weather_Condition),
         Wind_Direction_Clean = as.factor(Wind_Direction),
         Weather_Timestamp_Clean = ymd_hms(Weather_Timestamp),
         State_Clean = as.factor(State),
         County_Clean = as.factor(County),
         City_Clean = as.factor(City),
         Side_Clean = as.factor(Side))
  

summary(crashes_clean)
      ID               Severity      Start_Time          End_Time        
 Length:1516064     Min.   :1.000   Length:1516064     Length:1516064    
 Class :character   1st Qu.:2.000   Class :character   Class :character  
 Mode  :character   Median :2.000   Mode  :character   Mode  :character  
                    Mean   :2.239                                        
                    3rd Qu.:2.000                                        
                    Max.   :4.000                                        
                                                                         
   Start_Lat       Start_Lng          End_Lat         End_Lng       
 Min.   :24.57   Min.   :-124.50   Min.   :24.57   Min.   :-124.50  
 1st Qu.:33.85   1st Qu.:-118.21   1st Qu.:33.85   1st Qu.:-118.21  
 Median :37.35   Median : -94.38   Median :37.35   Median : -94.38  
 Mean   :36.90   Mean   : -98.60   Mean   :36.90   Mean   : -98.60  
 3rd Qu.:40.73   3rd Qu.: -80.87   3rd Qu.:40.73   3rd Qu.: -80.87  
 Max.   :49.00   Max.   : -67.11   Max.   :49.08   Max.   : -67.11  
                                                                    
  Distance.mi.      Description            Number           Street         
 Min.   :  0.0000   Length:1516064     Min.   :      0   Length:1516064    
 1st Qu.:  0.0000   Class :character   1st Qu.:   1212   Class :character  
 Median :  0.1780   Mode  :character   Median :   4000   Mode  :character  
 Mean   :  0.5873                      Mean   :   8908                     
 3rd Qu.:  0.5940                      3rd Qu.:  10100                     
 Max.   :155.1860                      Max.   :9999997                     
                                       NA's   :1046095                     
     Side               City              County             State          
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   Zipcode            Country            Timezone         Airport_Code      
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Weather_Timestamp  Temperature.F.   Wind_Chill.F.     Humidity...    
 Length:1516064     Min.   :-89.00   Min.   :-89.0    Min.   :  1.00  
 Class :character   1st Qu.: 47.00   1st Qu.: 40.8    1st Qu.: 48.00  
 Mode  :character   Median : 61.00   Median : 57.0    Median : 68.00  
                    Mean   : 59.58   Mean   : 55.1    Mean   : 64.66  
                    3rd Qu.: 73.00   3rd Qu.: 71.0    3rd Qu.: 84.00  
                    Max.   :170.60   Max.   :113.0    Max.   :100.00  
                    NA's   :43033    NA's   :449316   NA's   :45509   
  Pressure.in.   Visibility.mi.   Wind_Direction     Wind_Speed.mph. 
 Min.   : 0.00   Min.   :  0.00   Length:1516064     Min.   :  0.00  
 1st Qu.:29.44   1st Qu.: 10.00   Class :character   1st Qu.:  4.60  
 Median :29.88   Median : 10.00   Mode  :character   Median :  7.00  
 Mean   :29.55   Mean   :  9.13                      Mean   :  7.63  
 3rd Qu.:30.04   3rd Qu.: 10.00                      3rd Qu.: 10.40  
 Max.   :58.04   Max.   :140.00                      Max.   :984.00  
 NA's   :36274   NA's   :44211                       NA's   :128862  
 Precipitation.in. Weather_Condition    Amenity              Bump          
 Min.   : 0        Length:1516064     Length:1516064     Length:1516064    
 1st Qu.: 0        Class :character   Class :character   Class :character  
 Median : 0        Mode  :character   Mode  :character   Mode  :character  
 Mean   : 0                                                                
 3rd Qu.: 0                                                                
 Max.   :24                                                                
 NA's   :510549                                                            
   Crossing           Give_Way           Junction           No_Exit         
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   Railway           Roundabout          Station              Stop          
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Traffic_Calming    Traffic_Signal     Turning_Loop       Sunrise_Sunset    
 Length:1516064     Length:1516064     Length:1516064     Length:1516064    
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Civil_Twilight     Nautical_Twilight  Astronomical_Twilight
 Length:1516064     Length:1516064     Length:1516064       
 Class :character   Class :character   Class :character     
 Mode  :character   Mode  :character   Mode  :character     
                                                            
                                                            
                                                            
                                                            
 Start_Time_Clean              End_Time_Clean               
 Min.   :2016-02-08 00:37:08   Min.   :2016-02-08 06:37:08  
 1st Qu.:2018-07-17 14:41:25   1st Qu.:2018-07-17 17:13:14  
 Median :2020-01-24 11:16:33   Median :2020-01-24 13:38:15  
 Mean   :2019-07-15 07:01:48   Mean   :2019-07-15 11:42:20  
 3rd Qu.:2020-10-22 13:01:30   3rd Qu.:2020-10-22 17:50:19  
 Max.   :2020-12-31 23:28:56   Max.   :2021-01-01 00:00:00  
                                                            
  Weather_Condition_Clean Wind_Direction_Clean Weather_Timestamp_Clean      
 Fair         :465252     CALM   :202870       Min.   :2016-02-08 00:53:00  
 Mostly Cloudy:193595     Calm   : 79192       1st Qu.:2018-07-10 10:55:30  
 Clear        :180223     WNW    : 77743       Median :2020-01-22 05:53:00  
 Cloudy       :161291     NW     : 75810       Mean   :2019-07-12 00:02:11  
 Partly Cloudy:133102     W      : 72059       3rd Qu.:2020-10-21 04:54:00  
 Overcast     : 87853     SSW    : 69901       Max.   :2020-12-31 23:35:00  
 (Other)      :294748     (Other):938489       NA's   :30264                
  State_Clean             County_Clean           City_Clean      Side_Clean 
 CA     :448833   Los Angeles   : 138819   Los Angeles:  39984   L: 221502  
 FL     :153007   Orange        :  49833   Miami      :  36233   R:1294562  
 OR     : 87484   Miami-Dade    :  47382   Charlotte  :  22203              
 TX     : 75142   San Bernardino:  30251   Houston    :  20843              
 NY     : 60974   San Diego     :  26623   Dallas     :  19497              
 MN     : 52345   Sacramento    :  25941   Sacramento :  18431              
 (Other):638279   (Other)       :1197215   (Other)    :1358873              

qmplot(Start_Lng, Start_Lat, data = crashes, maptype = "toner-lite", color = factor(Severity))
Using zoom = 4...
Source : http://tile.stamen.com/terrain/4/2/5.png
Source : http://tile.stamen.com/terrain/4/3/5.png
Source : http://tile.stamen.com/terrain/4/4/5.png
Source : http://tile.stamen.com/terrain/4/5/5.png
Source : http://tile.stamen.com/terrain/4/2/6.png
Source : http://tile.stamen.com/terrain/4/3/6.png
Source : http://tile.stamen.com/terrain/4/4/6.png
Source : http://tile.stamen.com/terrain/4/5/6.png

qmplot(End_Lng, End_Lat, data = crashes, maptype = "toner-lite", color = factor(Severity))
Using zoom = 4...


ggplot(data = crashes_clean, aes(x = Severity)) + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


ggplot(data = crashes_clean, aes(x = Start_Time_Clean, y = Distance.mi.)) + geom_line()

NA
NA

crashes_clean %>% 
  ggplot(aes(Start_Time_Clean)) + geom_histogram(binwidth = 86400)


crashes_clean %>% 
  mutate(wday = wday(Start_Time, label = TRUE)) %>% 
  ggplot(aes(x = wday)) +
    geom_bar()

NA
NA
NA

crashes_split <- initial_split(crashes_clean, prop = 0.75)

crashes_train <- training(crashes_split)
crashes_test <- testing(crashes_split)

crashes_xgb <- crashes %>% 
  select(-ID,
         -Description,
         -Street,
         -Weather_Timestamp,
         -Number,
         -Airport_Code,
         -Country,
         -Turning_Loop) %>% 
  drop_na()

crashes_split_xgb <- initial_split(crashes_xgb, prop = 0.75)

crashes_train_xbg <- training(crashes_split_xgb)
crashes_test_xbg <- testing(crashes_split_xgb)


sparse_matrix_train <- sparse.model.matrix(Severity ~ .-1, data = crashes_train_xbg)
sparse_matrix_test <- sparse.model.matrix(Severity ~ .-1, data = crashes_test_xbg)


y_train <- as.integer(crashes_train_xbg$Severity) - 1
y_test <- as.integer(crashes_test_xbg$Severity) - 1

xgb_train <- xgb.DMatrix(data = sparse_matrix_train, label = y_train)
xgb_test <- xgb.DMatrix(data = sparse_matrix_test, label = y_test)

xgb <- xgboost(data = xgb_train,
 eta = 0.1,
 max_depth = 15, 
 nround=15, 
 subsample = 0.5,
 colsample_bytree = 0.5,
 seed = 1,
 eval_metric = "merror",
 objective = "multi:softprob",
 num_class = 12,
 nthread = 3
)
[1] train-merror:0.121129 
[2] train-merror:0.119005 
[3] train-merror:0.116654 
[4] train-merror:0.116310 
[5] train-merror:0.115802 
[6] train-merror:0.114656 
[7] train-merror:0.113980 
[8] train-merror:0.113268 
[9] train-merror:0.112950 
[10]    train-merror:0.112491 
[11]    train-merror:0.112443 
[12]    train-merror:0.112142 
[13]    train-merror:0.111790 
[14]    train-merror:0.111420 
[15]    train-merror:0.110877 

y_pred <- predict(xgb, newdata = xgb_train)
print(length(y_pred))
[1] 8492208
print(head(y_pred))
[1] 0.03920371 0.64076769 0.05910405 0.04018567 0.02759238 0.02759238

err <- mean(as.numeric(y_pred > 0.5))
print(paste("test-error=", err))
[1] "test-error= 0.0724792656986263"


tree_plot <- xgb.plot.tree(model = xgb, trees = 1, feature.keep = 3)

tree_plot
NA
NA

importance_matrix <- xgb.importance(model = xgb)
xgb.plot.importance(importance_matrix)



importance_matrix
LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QiDQphdXRob3I6ICJEYW5pZWwgQ2hlbGxpbmciDQpzdWJ0aXRsZTogTUdTQyAzMTAgUHJvamVjdCANCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCiMgUGxlYXNlIGxlYXZlIHRoaXMgY29kZSBjaHVuayBhcyBpcy4gSXQgbWFrZXMgc29tZSBzbGlnaHQgZm9ybWF0dGluZyBjaGFuZ2VzIHRvIGFsdGVyIHRoZSBvdXRwdXQgdG8gYmUgbW9yZSBhZXN0aGV0aWNhbGx5IHBsZWFzaW5nLiANCg0KbGlicmFyeShrbml0cikNCg0KIyBDaGFuZ2UgdGhlIG51bWJlciBpbiBzZXQgc2VlZCB0byB5b3VyIG93biBmYXZvcml0ZSBudW1iZXINCnNldC5zZWVkKDE4MTgpDQpvcHRpb25zKHdpZHRoPTcwKQ0Kb3B0aW9ucyhzY2lwZW49OTkpDQoNCg0KIyB0aGlzIHNldHMgdGV4dCBvdXRwdXR0ZWQgaW4gY29kZSBjaHVua3MgdG8gc21hbGwNCm9wdHNfY2h1bmskc2V0KHRpZHkub3B0cz1saXN0KHdpZHRoLndyYXA9NTApLHRpZHk9VFJVRSwgc2l6ZSA9ICJ2c21hbGwiKSAgDQpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsDQogICAgICAgICAgICAgICAjICJjYWNoaW5nIiBzdG9yZXMgb2JqZWN0cyBpbiBjb2RlIGNodW5rcyBhbmQgb25seSByZXdyaXRlcyBpZiB5b3UgY2hhbmdlIHRoaW5ncw0KICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAjIGF1dG9tYXRpY2FsbHkgZG93bmxvYWRzIGRlcGVuZGVuY3kgZmlsZXMNCiAgICAgICAgICAgICAgIGF1dG9kZXAgPSBUUlVFLA0KICAgICAgICAgICAgICAgIyANCiAgICAgICAgICAgICAgIGNhY2hlLmNvbW1lbnRzID0gRkFMU0UsDQogICAgICAgICAgICAgICAjIA0KICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLA0KICAgICAgICAgICAgICAgIyBjaGFuZ2UgZmlnLndpZHRoIGFuZCBmaWcuaGVpZ2h0IHRvIGNoYW5nZSB0aGUgY29kZSBoZWlnaHQgYW5kIHdpZHRoIGJ5IGRlZmF1bHQNCiAgICAgICAgICAgICAgIGZpZy53aWR0aCA9IDUuNSwgIA0KICAgICAgICAgICAgICAgZmlnLmhlaWdodCA9IDQuNSwNCiAgICAgICAgICAgICAgIGZpZy5hbGlnbj0nY2VudGVyJykNCg0KDQpgYGANCg0KYGBge3Igc2V0dXAtMn0NCg0KIyBBbHdheXMgcHJpbnQgdGhpcyBvdXQgYmVmb3JlIHlvdXIgYXNzaWdubWVudA0Kc2Vzc2lvbkluZm8oKQ0KZ2V0d2QoKQ0KDQpgYGANCg0KDQo8IS0tICMjIyBzdGFydCBhbnN3ZXJpbmcgeW91ciBwcm9ibGVtIHNldCBoZXJlIC0tPg0KPCEtLSBZb3UgbWF5IGV4cG9ydCB5b3VyIGhvbWV3b3JrIGluIGVpdGhlciBodG1sIG9yIHBkZiwgd2l0aCB0aGUgZm9ybWVyIHVzdWFsbHkgYmVpbmcgZWFzaWVyLiANCiAgICAgVG8gZXhwb3J0IG9yIGNvbXBpbGUgeW91ciBSbWQgZmlsZTogY2xpY2sgYWJvdmUgb24gJ0tuaXQnIHRoZW4gJ0tuaXQgdG8gSFRNTCcgLS0+DQo8IS0tIEJlIHN1cmUgdG8gc3VibWl0IGJvdGggeW91ciAuUm1kIGZpbGUgYW5kIHRoZSBjb21waWxlZCAuaHRtbCBvciAucGRmIGZpbGUgZm9yIGZ1bGwgY3JlZGl0IC0tPg0KDQoNCmBgYHtyIHNldHVwLTN9DQoNCmxpYnJhcnkoImhlcmUiKQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmxpYnJhcnkoImZvcmNhdHMiKQ0KbGlicmFyeSgicnNhbXBsZSIpDQpsaWJyYXJ5KCJnZ3Bsb3QyIikNCmxpYnJhcnkoImdnbWFwIikNCmxpYnJhcnkoImRwbHlyIikNCmxpYnJhcnkoImx1YnJpZGF0ZSIpDQpsaWJyYXJ5KCJ4Z2Jvb3N0IikNCmxpYnJhcnkoJ0RpYWdyYW1tZVInKQ0KbGlicmFyeSgnTWF0cml4JykNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KY3Jhc2hlcyA8LSByZWFkLmNzdihoZXJlKCJkYXRhc2V0cyIsICJVU19BY2NpZGVudHNfRGVjMjBfdXBkYXRlZC5jc3YiKSkNCg0KDQpgYGANCg0KYGBge3J9DQoNCnN1bW1hcnkoY3Jhc2hlcykNCg0KDQpgYGANCg0KYGBge3J9DQoNCg0KY3Jhc2hlc19jbGVhbiA8LQ0KICBjcmFzaGVzICU+JSANCiAgbXV0YXRlKFN0YXJ0X1RpbWVfQ2xlYW4gPSB5bWRfaG1zKFN0YXJ0X1RpbWUpLA0KICAgICAgICAgRW5kX1RpbWVfQ2xlYW4gPSB5bWRfaG1zKEVuZF9UaW1lKSwNCiAgICAgICAgIFdlYXRoZXJfQ29uZGl0aW9uX0NsZWFuID0gYXMuZmFjdG9yKFdlYXRoZXJfQ29uZGl0aW9uKSwNCiAgICAgICAgIFdpbmRfRGlyZWN0aW9uX0NsZWFuID0gYXMuZmFjdG9yKFdpbmRfRGlyZWN0aW9uKSwNCiAgICAgICAgIFdlYXRoZXJfVGltZXN0YW1wX0NsZWFuID0geW1kX2htcyhXZWF0aGVyX1RpbWVzdGFtcCksDQogICAgICAgICBTdGF0ZV9DbGVhbiA9IGFzLmZhY3RvcihTdGF0ZSksDQogICAgICAgICBDb3VudHlfQ2xlYW4gPSBhcy5mYWN0b3IoQ291bnR5KSwNCiAgICAgICAgIENpdHlfQ2xlYW4gPSBhcy5mYWN0b3IoQ2l0eSksDQogICAgICAgICBTaWRlX0NsZWFuID0gYXMuZmFjdG9yKFNpZGUpKQ0KICANCg0Kc3VtbWFyeShjcmFzaGVzX2NsZWFuKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpxbXBsb3QoU3RhcnRfTG5nLCBTdGFydF9MYXQsIGRhdGEgPSBjcmFzaGVzLCBtYXB0eXBlID0gInRvbmVyLWxpdGUiLCBjb2xvciA9IGZhY3RvcihTZXZlcml0eSkpDQoNCnFtcGxvdChFbmRfTG5nLCBFbmRfTGF0LCBkYXRhID0gY3Jhc2hlcywgbWFwdHlwZSA9ICJ0b25lci1saXRlIiwgY29sb3IgPSBmYWN0b3IoU2V2ZXJpdHkpKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KZ2dwbG90KGRhdGEgPSBjcmFzaGVzX2NsZWFuLCBhZXMoeCA9IFNldmVyaXR5KSkgKyBnZW9tX2hpc3RvZ3JhbSgpDQoNCg0KDQpgYGANCg0KYGBge3J9DQoNCmdncGxvdChkYXRhID0gY3Jhc2hlc19jbGVhbiwgYWVzKHggPSBTdGFydF9UaW1lX0NsZWFuLCB5ID0gRGlzdGFuY2UubWkuKSkgKyBnZW9tX2xpbmUoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KY3Jhc2hlc19jbGVhbiAlPiUgDQogIGdncGxvdChhZXMoU3RhcnRfVGltZV9DbGVhbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA4NjQwMCkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpjcmFzaGVzX2NsZWFuICU+JSANCiAgbXV0YXRlKHdkYXkgPSB3ZGF5KFN0YXJ0X1RpbWUsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gd2RheSkpICsNCiAgICBnZW9tX2JhcigpDQoNCg0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpjcmFzaGVzX3NwbGl0IDwtIGluaXRpYWxfc3BsaXQoY3Jhc2hlc19jbGVhbiwgcHJvcCA9IDAuNzUpDQoNCmNyYXNoZXNfdHJhaW4gPC0gdHJhaW5pbmcoY3Jhc2hlc19zcGxpdCkNCmNyYXNoZXNfdGVzdCA8LSB0ZXN0aW5nKGNyYXNoZXNfc3BsaXQpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KDQpjcmFzaGVzX3hnYiA8LSBjcmFzaGVzICU+JSANCiAgc2VsZWN0KC1JRCwNCiAgICAgICAgIC1EZXNjcmlwdGlvbiwNCiAgICAgICAgIC1TdHJlZXQsDQogICAgICAgICAtV2VhdGhlcl9UaW1lc3RhbXAsDQogICAgICAgICAtTnVtYmVyLA0KICAgICAgICAgLUFpcnBvcnRfQ29kZSwNCiAgICAgICAgIC1Db3VudHJ5LA0KICAgICAgICAgLVR1cm5pbmdfTG9vcCkgJT4lIA0KICBkcm9wX25hKCkNCg0KY3Jhc2hlc19zcGxpdF94Z2IgPC0gaW5pdGlhbF9zcGxpdChjcmFzaGVzX3hnYiwgcHJvcCA9IDAuNzUpDQoNCmNyYXNoZXNfdHJhaW5feGJnIDwtIHRyYWluaW5nKGNyYXNoZXNfc3BsaXRfeGdiKQ0KY3Jhc2hlc190ZXN0X3hiZyA8LSB0ZXN0aW5nKGNyYXNoZXNfc3BsaXRfeGdiKQ0KDQoNCnNwYXJzZV9tYXRyaXhfdHJhaW4gPC0gc3BhcnNlLm1vZGVsLm1hdHJpeChTZXZlcml0eSB+IC4tMSwgZGF0YSA9IGNyYXNoZXNfdHJhaW5feGJnKQ0Kc3BhcnNlX21hdHJpeF90ZXN0IDwtIHNwYXJzZS5tb2RlbC5tYXRyaXgoU2V2ZXJpdHkgfiAuLTEsIGRhdGEgPSBjcmFzaGVzX3Rlc3RfeGJnKQ0KDQoNCnlfdHJhaW4gPC0gYXMuaW50ZWdlcihjcmFzaGVzX3RyYWluX3hiZyRTZXZlcml0eSkgLSAxDQp5X3Rlc3QgPC0gYXMuaW50ZWdlcihjcmFzaGVzX3Rlc3RfeGJnJFNldmVyaXR5KSAtIDENCg0KeGdiX3RyYWluIDwtIHhnYi5ETWF0cml4KGRhdGEgPSBzcGFyc2VfbWF0cml4X3RyYWluLCBsYWJlbCA9IHlfdHJhaW4pDQp4Z2JfdGVzdCA8LSB4Z2IuRE1hdHJpeChkYXRhID0gc3BhcnNlX21hdHJpeF90ZXN0LCBsYWJlbCA9IHlfdGVzdCkNCg0KDQpgYGANCg0KYGBge3J9DQoNCnhnYiA8LSB4Z2Jvb3N0KGRhdGEgPSB4Z2JfdHJhaW4sDQogZXRhID0gMC4xLA0KIG1heF9kZXB0aCA9IDE1LCANCiBucm91bmQ9MTUsIA0KIHN1YnNhbXBsZSA9IDAuNSwNCiBjb2xzYW1wbGVfYnl0cmVlID0gMC41LA0KIHNlZWQgPSAxLA0KIGV2YWxfbWV0cmljID0gIm1lcnJvciIsDQogb2JqZWN0aXZlID0gIm11bHRpOnNvZnRwcm9iIiwNCiBudW1fY2xhc3MgPSAxMiwNCiBudGhyZWFkID0gMw0KKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQp5X3ByZWQgPC0gcHJlZGljdCh4Z2IsIG5ld2RhdGEgPSB4Z2JfdHJhaW4pDQpwcmludChsZW5ndGgoeV9wcmVkKSkNCnByaW50KGhlYWQoeV9wcmVkKSkNCg0KYGBgDQoNCmBgYHtyfQ0KDQplcnIgPC0gbWVhbihhcy5udW1lcmljKHlfcHJlZCA+IDAuNSkpDQpwcmludChwYXN0ZSgidGVzdC1lcnJvcj0iLCBlcnIpKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KDQp0cmVlX3Bsb3QgPC0geGdiLnBsb3QudHJlZShtb2RlbCA9IHhnYiwgdHJlZXMgPSAxLCBmZWF0dXJlLmtlZXAgPSAzKQ0KDQp0cmVlX3Bsb3QNCg0KDQpgYGANCmBgYHtyfQ0KDQppbXBvcnRhbmNlX21hdHJpeCA8LSB4Z2IuaW1wb3J0YW5jZShtb2RlbCA9IHhnYikNCnhnYi5wbG90LmltcG9ydGFuY2UoaW1wb3J0YW5jZV9tYXRyaXgpDQoNCg0KaW1wb3J0YW5jZV9tYXRyaXgNCmBgYA==